package cn.mujiankeji.mbrowser.功能.浏览框.助手

import android.util.Base64
import android.util.Log
import android.webkit.JavascriptInterface
import androidx.annotation.Keep
import cn.mujiankeji.mbrowser.工具.操作.简易文本匹配器
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框加载状态
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框状态
import cn.mujiankeji.mbrowser.功能.浏览框.模型.网络文件信息
import com.blankj.utilcode.util.ClipboardUtils
import org.json.JSONObject

/**
 * 历史遗留的问题，很多函数都是乱命名的，别改，最多写个注释！
 */
@Keep
open class 浏览框交互助手(val state : 浏览框状态) {

    var videoInfoListener : ((String?,progress : Int) -> Unit) ?= null // 时间单位为秒

    // 兼容via脚本库
    @JavascriptInterface
    fun addon(value: String) {
        try {
            val obj = JSONObject(String(Base64.decode(value, 0)))
            val code = String(Base64.decode(obj.getString("code"), 0))
            state.响应安装扩展或脚本?.invoke(code)
        }catch (ex : Exception){
            ex.printStackTrace()
            return
        }
    }

    @JavascriptInterface
    fun videoInfo(t : String){
        videoInfoListener?.invoke(t,0)
    }
    @JavascriptInterface
    fun videoProgress(t : Int){
        videoInfoListener?.invoke(null,t)
    }

    /**
     * TODO 广告过滤
     */
    @JavascriptInterface
    fun getAdblockElement() : String{
        /*if (!kt.config.enableAdblock || state.状态 == PageState.complete){
            return ""
        }

        try {
            return kt.webData.hideElementStr
        }
        catch (e : Exception){
            return ""
        }finally {
            kt.webData.hideElementStr = ""
            if (kt is View) kt.postInvalidate()
        }*/
        return ""
    }

    @JavascriptInterface
    fun readyState(str : String){
        if (str.equals("complete",true) && state.状态!= 浏览框加载状态.加载完毕){
            // 进度还没到 20 就完成加载页面... 低版本WebView的bug 需要重载
            if (state.加载进度.value < 20) {
                state.重置()
                return
            }else{
                state.更新加载状态(浏览框加载状态.加载完毕)
            }
        }

        // 状态 加载到内容
        else if (str.equals("interactive",true) && state.状态!= 浏览框加载状态.静态元素加载完毕){
            state.更新加载状态(浏览框加载状态.静态元素加载完毕)

        }

        // 交互脚本是否已注入
        else if (str.equals("scriptEnd")){
            state.交互脚本是否已注入 = true
        }

    }

    /**
     * TODO 广告过滤
     * 得到隐藏元素返回的数据 \n 隔开
     */
    @JavascriptInterface
    fun m_hide_rule_callback(v : String?){
        /*if (kt.webData.hideCompleteElementRuleListString != v && v != null){
            kt.webData.hideCompleteElementRuleListString = v
            kt.upAdSize()
        }*/
    }

    @JavascriptInterface
    fun m_elemenTools_SelContentChange(type: Int, arg: String?) {
        // 0=当前显示选中，1=0的父， 2=虫子审查元素不显示处理的选中， 3=2的父
        if (type == 0){
            state.选中元素代码.value.value = arg ?:""
        }
        // TODO 元素工具 kt.elementToolsListener?.selChange(type, arg?:"")
    }

    /**
     * 更新标记的项目数
     */
    @JavascriptInterface
    fun m_elementhide_upstartitem(size : Int){
        // 重新选中隐藏项目并返回该目前对应的父项目数
        // TODO 元素工具 kt.elementToolsListener?.onParentItemSizeUp(size)
    }

    // 选择回调
    @JavascriptInterface
    fun longTextCallBack(type: Int, value: String?) {
        // TODO 长按复制菜单问题
        /*App.un {
            kt.closeCopyAction()
            WebUtils.longClickFun(type, value)
        }*/
    }

    @JavascriptInterface
    fun m_changeHideElementRule(value : String?){
        // TODO 元素工具 kt.elementToolsListener?.onChangeHideElementRule(value?:"")
    }



    @JavascriptInterface
    fun htmlCallback(text: String?) {
        state.读源码听众?.invoke(text ?: "")
    }

    @JavascriptInterface
    fun iframeSize(w : Int,h : Int,w2 : Int,h2 : Int){
        state.更新页面框架层大小(w,h,w2,h2)
    }



    /**
     * 拦截悬窗播放
     */
    @JavascriptInterface
    fun videoPlayStart(url: String?) {
        /*if (J.empty(url)
                || !url!!.startsWith("http")
                || !url.startsWith("rtmp")) return

        if (AppInfo.video网页视频悬窗){
            val headers = HashMap<String,String>()
            headers.put("referer",kt.webData.url)
            kt.parserMedia()
            //FloatPlayerUtils.start(url,headers)
        }*/
    }

    // 获取复制内容
    @JavascriptInterface
    fun getCopyContent() : String{
        return  ClipboardUtils.getText().toString()?:""
    }

    @JavascriptInterface
    fun log(v : String){
        Log.i("webmx-a",v)
    }

    @JavascriptInterface
    fun log(a : String,v : String){
        Log.i("webmx-a",v)
    }



    /*@JavascriptInterface
    fun xmlhttprequest(timeout: Long, method: String?, url: String?, data: String?, headers: String?, responseType: String?): String {
        return WebUtils.xmlhttprequest(timeout, method, url, data, headers, responseType)
    }*/
    @JavascriptInterface
    fun install(type: Int, value: String?) {
        state.响应安装扩展或脚本?.invoke(value?:return)
    }

    @JavascriptInterface
    fun copyCode(value: String?) {
        state.响应安装扩展或脚本?.invoke(value?:return)
    }

    @JavascriptInterface
    fun openUrl(url: String?) {
        state.响应加载新的页面?.invoke(url?:return)
    }

    /**
     * 搜索资源记录，返回所有包含对应关键词的项目链接 换行符隔开
     */
    @JavascriptInterface
    fun getweblogs(key: String): String? {
        var s = ""
        val ll: List<网络文件信息> = state.响应获取加载日记.invoke()
        for (i in ll.indices) {
            if (简易文本匹配器.匹配(ll[i].地址,key,false))  s += ll[i].地址.trimIndent() + "\n"
        }
        return s
    }

    /**
     * 搜索资源记录，第一个
     */
    @JavascriptInterface
    fun getweblog(key: String): String? {
        val ll: List<网络文件信息> = state.响应获取加载日记.invoke()
        for (i in ll.indices) {
            if (简易文本匹配器.匹配(ll[i].地址,key,false)) return ll[i].地址
        }
        return null
    }

    @JavascriptInterface
    fun childrenLength(length : Int){
        state.空白页面 =  length == 0
    }
}